package leetcode.Hot100;

/**
 * @author Cheng Jun
 * Description: 给定一个整数数组，其中第 i 个元素代表了第 i 天的股票价格 。
 * <p>
 * 设计一个算法计算出最大利润。在满足以下约束条件下，你可以尽可能地完成更多的交易（多次买卖一支股票）:
 * <p>
 * 你不能同时参与多笔交易（你必须在再次购买前出售掉之前的股票）。
 * 卖出股票后，你无法在第二天买入股票 (即冷冻期为 1 天)。
 * <p>
 * 来源：力扣（LeetCode）
 * 链接：https://leetcode-cn.com/problems/best-time-to-buy-and-sell-stock-with-cooldown
 * 著作权归领扣网络所有。商业转载请联系官方授权，非商业转载请注明出处。
 * @version 1.0
 * @date 2021/11/24 17:05
 * 输入: [1,2,3,0,2]
 * 输出: 3
 * 解释: 对应的交易状态为: [买入, 卖出, 冷冻期, 买入, 卖出]
 * @see maxProfit2
 */
public class maxProfitFreeze {
    public static void main(String[] args) {

    }

    // 动态规划状态定义：dp[i] 表示 prices[i] 能获得的最大利润
    // dp 初始值：dp[0] = 0
    // dp 转移方程：dp[i] = Math.max((dp[j-1]) + (prices[i]-prices[j]) )
    // 这题和 maxProfit2 很相似，只是加了一个冷冻期的概念，那我们就需要维护 二维数组 dp[i][j]  j 有两种情况 dp[i][0] 表示 下一天不处于冷冻期

    // 我们目前持有一支股票，对应的「累计最大收益」记为 f[i][0]；
    //
    // 我们目前不持有任何股票，并且处于冷冻期中，对应的「累计最大收益」记为 f[i][1]；
    //
    // 我们目前不持有任何股票，并且不处于冷冻期中，对应的「累计最大收益」记为 f[i][2]。

    static int maxProfit(int[] prices) {
        if (prices.length == 0) {
            return 0;
        }
        int f0 = -prices[0];
        int f1 = 0;
        int f2 = 0;
        for (int i = 1; i < prices.length; i++) {
            int temp0 = f0;
            int temp1 = f1;
            int temp2 = f2;
            f0 = Math.max(temp0, f2 - prices[i]);
            f1 = temp0 + prices[i];
            f2 = Math.max(temp1, temp2);
        }
        return Math.max(f1, f2);
    }
}
